package com.hex.ds.hdrs.watch.service;

import lombok.extern.slf4j.Slf4j;

@Slf4j
//@Service  不需要邮件  暂时注释
public class MailService {

    /*//默认编码
    public static final String DEFAULT_ENCODING = "UTF-8";

    @Value("${spring.mail.username}")
    private String userName;

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private TemplateEngine templateEngine;

    *//**
     * 发送一个简单的文本邮件
     *
     * @param subject：邮件主题，即邮件的邮件名称
     * @param content：邮件内容
     * @param toWho：需要发送的人
     *//*
    public void sendSimpleTextMailActual(String subject, String content,String[] toWho){
        this.sendSimpleTextMailActual(subject, content, toWho, null, null, null);
    }

    *//**
     * 发送一个简单的文本邮件，可以附带附件
     *
     * @param subject：邮件主题，即邮件的邮件名称
     * @param content：邮件内容
     * @param toWho：需要发送的人
     * @param attachments：需要附带的附件，附件请保证一定要存在，否则将会被忽略掉
     *//*
    public void sendSimpleTextMailActual(String subject, String content,String[] toWho, String[] attachments){
        this.sendSimpleTextMailActual(subject, content, toWho, null, null, attachments);
    }

    *//**
     * 发送一个简单的文本邮件
     *
     * @param subject：邮件主题，即邮件的邮件名称
     * @param content：邮件内容
     * @param toWho：需要发送的人
     * @param ccPeoples：需要抄送的人
     *//*
    public void sendSimpleTextMail(String subject, String content,String[] toWho, String[] ccPeoples){
        this.sendSimpleTextMailActual(subject, content, toWho, ccPeoples, null, null);
    }

    *//**
     * 发送一个简单的文本邮件，可以附带附件：文本邮件发送的基本方法
     *
     * @param subject：邮件主题，即邮件的邮件名称
     * @param content：邮件内容
     * @param toWho：需要发送的人
     * @param ccPeoples：需要抄送的人
     * @param attachments：需要附带的附件，附件请保证一定要存在，否则将会被忽略掉
     *//*
    public void sendSimpleTextMail(String subject, String content,String[] toWho, String[] ccPeoples, String[] attachments){
        this.sendSimpleTextMailActual(subject, content, toWho, ccPeoples, null, attachments);
    }

    *//**
     * 发送一个简单的文本邮件，可以附带附件：文本邮件发送的基本方法
     *
     * @param subject：邮件主题，即邮件的邮件名称
     * @param content：邮件内容
     * @param toWho：需要发送的人
     * @param ccPeoples：需要抄送的人
     * @param bccPeoples：需要密送的人
     * @param attachments：需要附带的附件，附件请保证一定要存在，否则将会被忽略掉
     *//*
    public void sendSimpleTextMailActual(String subject, String content, String[] toWho, String[] ccPeoples, String[] bccPeoples, String[] attachments) {

        //检验参数：邮件主题、收件人、邮件内容必须不为空才能够保证基本的逻辑执行
        if (subject == null || toWho == null || toWho.length == 0 || content == null) {
            log.error("邮件-> {} 无法继续执行，因为缺少基本的参数：邮件主题、收件人、邮件内容", subject);
            throw new RuntimeException("模板邮件无法继续发送，因为缺少必要的参数！");
        }

        log.info("开始发送简单文本邮件：主题->{}，收件人->{}，抄送人->{}，密送人->{}，附件->{}", subject, toWho, ccPeoples, bccPeoples, attachments);

        //附件处理，需要处理附件时，需要使用二进制信息，使用 MimeMessage 类来进行处理
        if (attachments != null && attachments.length > 0) {
            try {
                //附件处理需要进行二进制传输
                MimeMessage mimeMessage = mailSender.createMimeMessage();
                MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, DEFAULT_ENCODING);
                //设置邮件的基本信息：这些函数都会在后面列出来
                boolean continueProcess = handleBasicInfo(helper, subject, content, toWho, ccPeoples, bccPeoples, false);
                //如果处理基本信息出现错误
                if (!continueProcess) {
                    log.error("邮件基本信息出错: 主题->{}", subject);
                    return;
                }
                //处理附件
                handleAttachment(helper, subject, attachments);
                //发送该邮件
                mailSender.send(mimeMessage);
                log.info("发送邮件成功: 主题->{}", subject);
            } catch (MessagingException e) {

                log.error("发送邮件失败: 主题->{}", subject);
            }
        } else {
            //创建一个简单邮件信息对象
            SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
            //设置邮件的基本信息
            handleBasicInfo(simpleMailMessage, subject, content, toWho, ccPeoples, bccPeoples);
            //发送邮件
            mailSender.send(simpleMailMessage);
            log.info("发送邮件成功: 主题->{}", subject, toWho, ccPeoples, bccPeoples, attachments);
        }
    }

    *//**
     * 处理二进制邮件的基本信息，比如需要带附件的文本邮件、HTML文件、图片邮件、模板邮件等等
     *
     * @param mimeMessageHelper：二进制文件的包装类
     * @param subject：邮件主题
     * @param content：邮件内容
     * @param toWho：收件人
     * @param ccPeoples：抄送人
     * @param bccPeoples：暗送人
     * @param isHtml：是否是HTML文件，用于区分带附件的简单文本邮件和真正的HTML文件
     * @return ：返回这个过程中是否出现异常，当出现异常时会取消邮件的发送
     *//*
    private boolean handleBasicInfo(MimeMessageHelper mimeMessageHelper, String subject, String content, String[] toWho, String[] ccPeoples, String[] bccPeoples, boolean isHtml) {

        try {
            //设置必要的邮件元素
            //设置发件人
            mimeMessageHelper.setFrom(userName);
            //设置邮件的主题
            mimeMessageHelper.setSubject(subject);
            //设置邮件的内容，区别是否是HTML邮件
            mimeMessageHelper.setText(content, isHtml);
            //设置邮件的收件人
            mimeMessageHelper.setTo(toWho);
            //设置非必要的邮件元素，在使用helper进行封装时，这些数据都不能够为空
            if (ccPeoples != null){
                //设置邮件的抄送人：MimeMessageHelper # Assert.notNull(cc, "Cc address array must not be null");
                mimeMessageHelper.setCc(ccPeoples);
            }
            if (bccPeoples != null){
                //设置邮件的密送人：MimeMessageHelper # Assert.notNull(bcc, "Bcc address array must not be null");
                mimeMessageHelper.setBcc(bccPeoples);
            }
            return true;
        } catch (MessagingException e) {


            log.error("邮件基本信息出错->{}", subject);
        }
        return false;
    }

    *//**
     * 用于填充简单文本邮件的基本信息
     *
     * @param simpleMailMessage：文本邮件信息对象
     * @param subject：邮件主题
     * @param content：邮件内容
     * @param toWho：收件人
     * @param ccPeoples：抄送人
     * @param bccPeoples：暗送人
     *//*
    private void handleBasicInfo(SimpleMailMessage simpleMailMessage, String subject, String content, String[] toWho, String[] ccPeoples, String[] bccPeoples) {

        //设置发件人
        simpleMailMessage.setFrom(userName);
        //设置邮件的主题
        simpleMailMessage.setSubject(subject);
        //设置邮件的内容
        simpleMailMessage.setText(content);
        //设置邮件的收件人
        simpleMailMessage.setTo(toWho);
        //设置邮件的抄送人
        simpleMailMessage.setCc(ccPeoples);
        //设置邮件的密送人
        simpleMailMessage.setBcc(bccPeoples);
    }

    *//**
     * 用于处理附件信息，附件需要 MimeMessage 对象
     *
     * @param mimeMessageHelper：处理附件的信息对象
     * @param subject：邮件的主题，用于日志记录
     * @param attachmentFilePaths：附件文件的路径，该路径要求可以定位到本机的一个资源
     *//*
    private void handleAttachment(MimeMessageHelper mimeMessageHelper, String subject, String[] attachmentFilePaths) {

        //判断是否需要处理邮件的附件
        if (attachmentFilePaths != null && attachmentFilePaths.length > 0) {
            FileSystemResource resource;
            String fileName;
            //循环处理邮件的附件
            for (String attachmentFilePath : attachmentFilePaths) {
                //获取该路径所对应的文件资源对象
                resource = new FileSystemResource(new File(attachmentFilePath));

                //判断该资源是否存在，当不存在时仅仅会打印一条警告日志，不会中断处理程序。
                // 也就是说在附件出现异常的情况下，邮件是可以正常发送的，所以请确定你发送的邮件附件在本机存在
                if (!resource.exists()) {
                    log.warn("邮件->{} 的附件->{} 不存在！", subject, attachmentFilePath);
                    //开启下一个资源的处理
                    continue;
                }
                //获取资源的名称
                fileName = resource.getFilename();
                try {
                    //添加附件
                    mimeMessageHelper.addAttachment(fileName, resource);
                } catch (MessagingException e) {

                    log.error("邮件->{} 添加附件->{} 出现异常->{}", subject, attachmentFilePath, e.getMessage());
                }
            }
        }
    }

    *//**
     * 可以用来发送带有图片的HTML模板邮件
     *
     * @param subject：邮件主题
     * @param toWho：收件人
     * @param templateName：模板名称
     * @param context：模板解析需要的数据
     *//*
    public void sendHtmlTemplateMailActual(String subject, String[] toWho, String templateName, Context context) {
        this.sendHtmlTemplateMailActual(subject, toWho, null, null, null, templateName, context, null);
    }

    *//**
     * 可以用来发送带有图片的HTML模板邮件
     *
     * @param subject：邮件主题
     * @param toWho：收件人
     * @param ccPeoples：抄送人
     * @param templateName：模板名称
     * @param context：模板解析需要的数据
     *//*
    public void sendHtmlTemplateMailActual(String subject, String[] toWho, String[] ccPeoples, String templateName, Context context) {
        this.sendHtmlTemplateMailActual(subject, toWho, ccPeoples, null, null, templateName, context, null);
    }

    *//**
     * 可以用来发送带有图片的HTML模板邮件
     *
     * @param subject：邮件主题
     * @param toWho：收件人
     * @param ccPeoples：抄送人
     * @param bccPeoples：暗送人
     * @param templateName：模板名称
     * @param context：模板解析需要的数据
     *//*
    public void sendHtmlTemplateMailActual(String subject, String[] toWho, String[] ccPeoples, String[] bccPeoples, String templateName, Context context) {
        this.sendHtmlTemplateMailActual(subject, toWho, ccPeoples, bccPeoples, null, templateName, context, null);
    }

    *//**
     * 可以用来发送带有图片的HTML模板邮件
     *
     * @param subject：邮件主题
     * @param toWho：收件人
     * @param ccPeoples：抄送人
     * @param bccPeoples：暗送人
     * @param attachments：附件
     * @param templateName：模板名称
     * @param context：模板解析需要的数据
     *//*
    public void sendHtmlTemplateMailActual(String subject, String[] toWho, String[] ccPeoples, String[] bccPeoples, String[] attachments, String templateName, Context context) {
        this.sendHtmlTemplateMailActual(subject, toWho, ccPeoples, bccPeoples, attachments, templateName, context, null);
    }

    *//**
     * 可以用来发送带有图片的HTML模板邮件
     *
     * @param subject：邮件主题
     * @param toWho：收件人
     * @param ccPeoples：抄送人
     * @param bccPeoples：暗送人
     * @param attachments：附件
     * @param templateName：模板名称
     * @param context：模板解析需要的数据
     * @param imageResourceSet：图片资源的资源对象
     *//*
    public void sendHtmlTemplateMailActual(String subject, String[] toWho, String[] ccPeoples, String[] bccPeoples, String[] attachments, String templateName, Context context, Set<ImageResource> imageResourceSet) {

        //检验参数：邮件主题、收件人、模板名称必须不为空才能够保证基本的逻辑执行
        if (subject == null || toWho == null || toWho.length == 0 || templateName == null) {
            log.error("邮件-> {} 无法继续执行，因为缺少基本的参数：邮件主题、收件人、模板名称", subject);
            throw new RuntimeException("模板邮件无法继续发送，因为缺少必要的参数！");
        }

        //日志这个邮件的基本信息
        log.info("发送HTML模板邮件：主题->{}，收件人->{}，抄送人->{}，密送人->{}，附件->{}，模板名称->{}，模板解析参数->{}，图片资源->{}）", new Object[]{subject, toWho, ccPeoples, bccPeoples, attachments, templateName, context,imageResourceSet});
        try {
            //context不能够为空，需要进行检查
            if (context == null) {
                context = new Context();
                log.info("邮件->{} 的context为空！", subject);
            }

            //模板引擎处理模板获取到HTML字符串，这里会可能会抛出一个继承于RuntimeException的模板引擎异常
            String content = templateEngine.process(templateName, context);
            MimeMessage mimeMessage = mailSender.createMimeMessage();

            //默认编码为UTF-8
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, DEFAULT_ENCODING);
            //处理内联的图片资源的占位转换
            content = handleInLineImageResourceContent(helper,subject,content,imageResourceSet);
            log.info("解析邮件结果->{}", content);
            //处理基本信息
            boolean continueProcess = handleBasicInfo(helper, subject, content, toWho, ccPeoples, bccPeoples, true);
            if (!continueProcess) {
                log.error("邮件基本信息出错：主题->{}", subject);
                return;
            }
            //内联资源的资源附加，这个必须要放置在设置基本信息的操作后面，或者是全部内容解析完毕后才可以，不能边解析，边占位
            handleInLineImageResource(helper,subject,imageResourceSet);
            //处理附件
            handleAttachment(helper, subject, attachments);
            //发送该邮件
            mailSender.send(mimeMessage);
            log.info("发送邮件成功：主题->{}", subject);
        } catch (MessagingException e) {

            log.error("发送邮件失败：邮件主题->{}", subject);
        }
    }

    *//**
     * 处理内嵌图片的模板HTML邮件，返回一个已经修改过后的HTML字符串
     *
     * @param mimeMessageHelper：邮件信息包装类
     * @param subject：邮件主题
     * @param originContent：模板引擎所解析出来的原始HTML邮件
     * @param imageResourceSet：图片资源集合，用于字符集站位填充
     *
     * @return ：返回处理后的邮件内容
     *//*
    private String handleInLineImageResourceContent(MimeMessageHelper mimeMessageHelper, String subject, String originContent, Set<ImageResource> imageResourceSet){

        //处理内嵌的HTML图片文件
        if(imageResourceSet != null&&imageResourceSet.size() > 0){
            //资源的占位符ID
            String rscId;
            //资源的路径
            String resourcePath = null;
            //图片的位置信息
            String placeHolder;
            //图片资源文件
            FileSystemResource resource;

            for(ImageResource imageResource : imageResourceSet){

                //获取图片资源的基本信息
                rscId = imageResource.getId();
                placeHolder = imageResource.getPlaceholder();
                resourcePath = imageResource.getImageFilePath();

                resource = new FileSystemResource(new File(resourcePath));

                //判断图片资源是否存在
                if(!resource.exists()){
                    log.warn("邮件->{} 内联图片->{} 找不到",subject,resourcePath);
                    continue;
                }
                //替换图片资源在HTML中的位置
                originContent = originContent.replace("\"" + ImageResource.PLACEHOLDERPREFIX + placeHolder + "\"","\'cid:" + rscId + "\'");
            }
        }
        return originContent;
    }

    *//**
     * 填充文本数据，因为数据填充必须在设置基本数据后面进行，所以讲内容和数据的填充进行分离
     *
     * @param mimeMessageHelper
     * @param subject：邮件主题，用于日志记录
     * @param imageResourceSet：资源
     *//*
    private void handleInLineImageResource(MimeMessageHelper mimeMessageHelper, String subject, Set<ImageResource> imageResourceSet){

        if(imageResourceSet != null&&imageResourceSet.size() > 0){
            FileSystemResource resource;
            for(ImageResource imageResource : imageResourceSet){
                resource = new FileSystemResource(new File(imageResource.getImageFilePath()));
                if(!resource.exists()){
                    log.warn("邮件->{} 的内联图片文件->{} 不存在！",subject,imageResource);
                    continue;
                }
                try{
                    //添加内联资源
                    mimeMessageHelper.addInline(imageResource.getId(),resource);
                }catch(MessagingException e){

                    log.error("邮件->{} 的内联图片文件->{} 添加错误！",subject,imageResource);
                }
            }
        }
    }*/

}
